package empe;

import java.util.Random;

/**
 * Gere uma concretizacao da classe Evento.
 */
public class Mutacao extends Evento {



	public Mutacao(int t_actual, Individuo indiv) {
		super();
		individuo = indiv;
		tempo =  t_actual + calcular_tempo() + 1;

	}


	/**
	 * Gera uma observacao da variavel aleatoria
	 * @return valor (int) da observacao da variavel aleatoria
	 */
	protected int calcular_tempo() {
		Random random = new Random();
		double rand = random.nextDouble();

		return (int) Math.round(Math.abs(1-Math.log(individuo.ler_conforto())*Controlo.ler_delta()*Math.log(1.0-rand)));
	}


	/**
	 * Realiza a operacao de mutacao,recorrendo a' funcao mutar_individuo, de seguida,
	 * actualiza o seu tempo, assim aproveita-se o evento ja' criado para ser uma
	 * nova mutacao do presente individuo.
	 * @return a sua propria referencia.
	 */
	protected Evento simular() {

		Controlo.lista_individuo.mutar_individuo(individuo);

		this.tempo = this.tempo + calcular_tempo(); 

		return this;
	}


}
